/**
 * @Copyright:Copyright (c) 1991 - 2016
 * @Company: Macroview
 */
package com.tengtong.duang.commons.base;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.tengtong.duang.commons.collections.MapWrapper;
import com.tengtong.duang.commons.convert.ConversionService;
import com.tengtong.duang.commons.convert.ConversionServiceUtils;
import com.tengtong.duang.commons.utils.ReflectUtils;
import com.tengtong.duang.commons.utils.StringUtils;

/**
 * 一个数据 MAP，提供一些数据转换支持
 *
 * @author Jai
 * @since: v1.0
 */
public class DataMap<K, V> extends HashMap<K, V>{

	/**
	 * 快速创建只有一个元素的 map
	 *
	 * @param k
	 * @param v
	 * @return
	 */
	public static <K, V> DataMap<K, V> createSimpleValue(K key, V value){
		DataMap<K, V> result = new DataMap<K, V>();
		result.put(key, value);
		
		return result;
	}
	
	/**
	 * 设置数据，相当于 put。优点是做链式操作
	 *
	 * @param k
	 * @param v
	 * @return
	 */
	public DataMap<K, V> putData(K k, V v){
		put(k, v);
		
		return this;
	}
	
	/**
	 * 使用 MapWrapper 来包装，获取一些便捷的操作
	 *
	 * @return
	 */
	public MapWrapper<K, V> toMapWrapper(){
		return MapWrapper.wrapper(this);
	}
	
	/**
	 * 将整个 map 数据转成对象
	 *
	 * @param clazz
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public <T> T toObject(Class<T> clazz) throws Exception{
		return (T) ConversionServiceUtils.mapToObject(this, clazz);
	}
	
	/**
	 * 获取 key 的值，并转换成类型 clazz 来输出。值不存在，或者转换不成功，则返回 null
	 *
	 * @param key
	 * @param clazz
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public <T> T getAsObject(K key, Class<T> clazz) throws Exception{
		if(key != null){
			V value = get(key);
			if(value != null){
				Object o = ConversionServiceUtils.convertTo(value, clazz);
				if(o == ConversionService.NOT_FOUND_CONVERTER && ReflectUtils.isInheritance(value, Map.class)){
					o = ConversionServiceUtils.mapToObject((Map)value, clazz);
				}
				
				return (T)o;
			}
		}
		return null;
	}
	
	/**
	 * 获取值，并转为字符串
	 *
	 * @param key
	 * @return
	 */
	public String getAsString(K key){
        Object value = get(key);

        if (value == null) {
            return null;
        }
        
        Object o;
		try {
			o = ConversionServiceUtils.convertTo(value, String.class);
	        
	        if(o != ConversionService.NOT_FOUND_CONVERTER){
	        	value = o;
	        }
		}
		catch (Exception e) {}

        return value.toString();
	}
	
	/**
	 * 获取值，并转为 int 类型
	 *
	 * @param key
	 * @return
	 */
	public Integer getAsInteger(K key){
        Object value = get(key);

        if(value != null){
        	if(value instanceof Integer){
        		return (Integer)value;
        	}
        	
        	if(value instanceof String){
        		String strV = value.toString();
        		if(StringUtils.isEmpty(strV) || "null".equals(strV)){
        			return null;
        		}
        		return Integer.valueOf(value.toString());
        	}
        	
        	if(value instanceof Number){
        		return ((Number)value).intValue();
        	}
        }
        return null;
	}
	
	/**
	 * 获取值，并转为 int 类型
	 *
	 * @param key
	 * @return
	 */
	public Long getAsLong(K key){
        Object value = get(key);

        if(value != null){
        	if(value instanceof Long){
        		return (Long)value;
        	}
        	
        	if(value instanceof String){
        		String strV = value.toString();
        		if(StringUtils.isEmpty(strV) || "null".equals(strV)){
        			return null;
        		}
        		return Long.valueOf(value.toString());
        	}
        	
        	if(value instanceof Number){
        		return ((Number)value).longValue();
        	}
        }
        return null;
	}
	
	/**
	 * 布尔变量
	 *
	 * @param key
	 * @return
	 */
	public Boolean getAsBoolean(K key){
        Object value = get(key);

        if(value != null){
        	if(value instanceof Boolean){
        		return (Boolean)value;
        	}
        	
            Object o;
    		try {
    			o = ConversionServiceUtils.convertTo(value, Boolean.class);
    	        
    	        if(o != ConversionService.NOT_FOUND_CONVERTER){
    	        	return (Boolean)o;
    	        }
    		}
    		catch (Exception e) {}
        }		
        
        return null;
	}

	/**
	 * 布尔变量
	 *
	 * @param key
	 * @return
	 */
	public Date getAsDate(K key){
        Object value = get(key);

        if(value != null){
        	if(value instanceof Date){
        		return (Date)value;
        	}
        	
            Object o;
    		try {
    			o = ConversionServiceUtils.convertTo(value, Date.class);
    	        
    	        if(o != ConversionService.NOT_FOUND_CONVERTER){
    	        	return (Date)o;
    	        }
    		}
    		catch (Exception e) {}
        }		
        
        return null;
	}
	
	/**
	 * 使用 fastjson 来转成 json
	 *
	 * @return
	 */
	public String toJson(){
		return JSON.toJSONString(this);
	}
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 6241328220784714433L;
}
